8 CLR 10 U$="[197][197][197][197][197][197][197][197][197]":O$="[164][164][164][164][164][164][164][164][164]":A$="ADRESSIERUNG" 20 PRINT"[147][164][164]";O$;O$;O$;O$:PRINT"SYNTAX-LEHRGANG 'MASCHINENSPRACHE' (4)" 30 FORI=0TO999:NEXT 100 DATA162,0,181,0,157,0,128,232,208,248,96 110 RESTORE:FORI=0TO10:READIN:POKE826+I,IN:NEXT 200 PRINT"[147][164][164][164]";O$;O$;O$:PRINT"1.2.3.9. RELATIVE-";A$;"[146]" 210 PRINT"WIR KOMMEN NUN ZU DEM WICHTIGEN AB-" 220 PRINT"SCHNITT DER BEDINGTEN SPRUNGBEFEHLE." 230 PRINT"JE NACH ERGEBNIS EINER RECHENOPERATION" 240 PRINT"FUEHRT DIE CPU EINEN SPRUNG IM PROGRAMM" 250 PRINT"AUS ODER NICHT. EINE EIGENART DER CPU" 260 PRINT"6502 IST, DASS DERARTIGE SPRUENGE STETS" 270 PRINT"RELATIV SIND. D.H.: ES WIRD NICHT DIE" 280 PRINT"ADRESSE ANGEGEBEN,DIE ANGESPRUNGEN WER-" 290 PRINT"DEN SOLL, SONDERN DIE ANZAHL DER BYTES," 300 PRINT"DIE DIE CPU UEBERSPRINGEN SOLL.":PRINTU$;U$;U$;"[197][197][197][197][145]" 310 I=1:GOSUB5000:IFFLTHEN20 400 PRINT"[147]EIN WICHTIGER BEDINGTER SPRUNGBEFEHL" 410 PRINT"SEI VORWEGGENOMMEN: 'BNE'. ER BEDEUTET:" 420 PRINT"[164][157]B[146]RANCH IF[160] RESULT [160]N[146][145][157][164]OT [160]E[146][145][157][164]QUAL [160]ZERO." 430 PRINT"(SPRINGE, FALLS DAS ERGEBNIS UNGLEICH" 435 PRINT"NULL WAR !)" 440 PRINT"DER BEFEHL 'BNE $08' BEDEUTET FUER DIE" 450 PRINT"CPU: FALLS DAS ERGEBNIS DER LETZTEN RE-" 460 PRINT"CHENOPERATION UNGLEICH NULL WAR, UEBER-" 470 PRINT"SPRINGE DIE NAECHSTEN $08 BEFEHLSBYTES!" 480 PRINT"GEZAEHLT WIRD AB DEM ERSTEN BEFEHL NACH" 490 PRINT"DEM SPRUNGBEFEHL UND DER RELATIVEN" 500 PRINT"ADRESSE." 510 I=2:GOSUB5000:IFFLTHEN200 600 PRINT"[147]ALSO: * 0. BYTE 'BNE'" 610 PRINTTAB(6);"* 1. BYTE $08" 620 PRINTTAB(7);" 2. BYTE ... [192][192][174]" 625 PRINTTAB(24);"[221]" 630 FORN=3TO9:PRINTTAB(7);N;"[157]. BYTE ... [221]":PRINTTAB(24);"[221]":NEXT 640 PRINTTAB(7);"10. BYTE 'LDA' _[192][189]" 650 PRINT"";TAB(27);"ACHT" 660 PRINTTAB(27);"BYTE" 670 PRINTTAB(27);"VORWAERTS-" 680 PRINTTAB(27);"SPRUNG" 740 I=3:GOSUB5000:IFFLTHEN400 800 PRINT"[147]DER BEFEHL 'BNE $00' BEDEUTET UEBER-" 810 PRINT"SPRINGEN VON NULL BYTES, ALSO EFFEKTIV" 820 PRINT"KEINEN SPRUNG." 830 PRINT"DIE CPU KANN MAXIMAL 127 BYTE VORWAERTS" 840 PRINT"SPRINGEN (MIT 'BNE $7F'). RUECKWAERTS-" 850 PRINT"SPRUENGE SIND FOLGENDERMASSEN MOEGLICH:" 860 PRINT"$00 = 0 BYTE RUECKWAERTS" 870 PRINT"$FF = 1 BYTE RUECKWAERTS" 880 PRINT"$FE = 2 BYTE RUECKWAERTS" 890 PRINT"$FD = 3 BYTE RUECKWAERTS, ETC." 910 I=4:GOSUB5000:IFFLTHEN600 1000 PRINT"[147]DER WEITESTE RUECKWAERTSSPRUNG GEHT" 1010 PRINT"UEBER 128 BYTE: 'BNE $80'." 1020 PRINTB$;"RUECKWAERTSSPRUNG 8 BYTE:":PRINTU$ 1030 PRINTTAB(10);"0. BYTE 'LDA' _[192][174]" 1040 PRINTTAB(26);"[221]" 1050 FORN=1TO7:PRINTTAB(9);N;"[157]. BYTE ... [221]":PRINTTAB(26);"[221]":NEXT 1060 PRINTTAB(10);"8. BYTE ... [192][192][189]" 1080 PRINT"";TAB(29);"ACHT" 1090 PRINTTAB(29);"BYTE" 1100 PRINTTAB(29);"RUECK-" 1110 PRINTTAB(29);"WAERTS-" 1120 PRINTTAB(8);"*";TAB(18);"'BNE'";TAB(29);"SPRUNG" 1130 PRINTTAB(8);"*";TAB(19);"$F8" 1160 I=5:GOSUB5000:IFFLTHEN800 1200 PRINT"[147]VORTEIL DER RELATIVEN ";A$;": DIE" 1210 PRINT"PROGRAMME KOENNEN IN DEN RAMS BELIEBIG" 1220 PRINT"VERLAGERT WERDEN, DA JA KEINE ABSOLUTEN" 1230 PRINT"ADRESSEN VERWENDET WERDEN." 1240 PRINT"NACHTEILE: DIE BERECHNUNG RELATIVER" 1250 PRINT"ADRESSEN IST MUEHSAM UND FEHLERTRAECH-" 1260 PRINT"TIG. DIE SPRUNGWEITE IST SEHR BEGRENZT." 1270 PRINT"I.A. UEBERNIMMT EIN ASSEMBLERPROGRAMM" 1280 PRINT"DIE BERECHNUNG, SO DASS WENIGSTENS DIE" 1290 PRINT"ERSTEN NACHTEILE BEHEBBAR SIND." 1310 I=6:GOSUB5000:IFFLTHEN1000 1400 PRINT"[147]";O$;O$;O$:PRINT"1.2.4. EIN ERSTES BEISPIEL [146]" 1410 PRINT"WIR WAEHLEN NOCHMALS DAS PROBLEM DATEN-" 1420 PRINT"TRANSFER. WIR WOLLEN EIN PROGRAMM ER-" 1430 PRINT"STELLEN, DAS DIE INHALTE DER SPEICHER" 1440 PRINT"$0000 - $00FF NACH $8000 - $80FF UEBER-" 1450 PRINT"TRAEGT." 1460 PRINT"$0000 - $00FF IST DIE ZEROPAGE," 1470 PRINT"$8000 - $80FF IST DAS ERSTE VIERTEL DES" 1480 PRINT"BILDSCHIRMSPEICHERS." 1510 I=7:GOSUB5000:IFFLTHEN1200 1600 PRINT"[147]UM DAS PROBLEM PROGRAMMIEREN ZU KOENNEN" 1610 S$=" ":PRINT"MUESSEN WIR VIER WEITERE CPU-BEFEHLE" 1620 PRINT"VORWEGNEHMEN: 'LDX','STA','INX','RTS'." 1630 PRINT" 'LDX' (LOAD INDEX X WITH MEMORY)":PRINTSPC(9);"[163][160][160][163][160][160][160][160][160][160][160][163]" 1640 PRINT" 'STA' (STORE ACCUMULATOR TO MEMORY)":PRINTSPC(9);"[163][163][160][160][160][160][163]" 1650 PRINT" 'INX' (INCREMENT INDEX X BY ONE)":PRINTSPC(9);"[163][163][160][160][160][160][160][160] [163]" 1660 PRINT" 'RTS' (RETURN FROM SUBROUTINE)":PRINTSPC(9);"[163] [163][160][160][160][160][160] [163]" 1670 PRINT"DIE VIER BEFEHLE SIND EINFACH ZU VER-" 1680 PRINT"STEHEN UND BEWIRKEN FOLGENDES:" 1690 PRINT"'LDX' LAED EIN DATENWORT (BYTE) INS XR." 1700 PRINTS$;"Z.B. LAED 'LDX # $00' $00 INS XR." 1710 I=8:GOSUB5000:IFFLTHEN1400 1800 PRINT"[147]'STA' IST DIE UMKEHRUNG VON 'LDA'.SPEI-" 1820 PRINTS$;"CHERT DEN INHALT DES AC IN EINEN" 1830 PRINTS$;"SPEICHER, DESSEN ADRESSE DEM BE-" 1840 PRINTS$;"FEHL FOLGT. Z.B 'STA $0123' SPEI-" 1845 PRINTS$;"CHERT INHALT DES AC NACH $0123." 1850 PRINT"'INX' VERGROESSERT DEN INHALT DES XR UM" 1860 PRINTS$;"EINS. AUS $A2 WIRD $A3, AUS $FF" 1870 PRINTS$;"WIRD $00, ETC." 1880 PRINT"'RTS' BEWIRKT DEN RUECKSPRUNG INS HAUPT" 1890 PRINTS$;"PROGRAMM NACH AUFRUF EINES UNTER-" 1900 PRINTS$;"PROGRAMMS. (VGL. BASIC: 'RETURN')" 1910 I=9:GOSUB5000:IFFLTHEN1600 2000 PRINT"[147]NUN UNSER KLEINES PROGRAMM:" 2010 PRINTTAB(16);"HEX-CODE" 2015 PRINT"LDX # $00 A2 00" 2020 PRINT"LDA $00,X _[174] B5 00":PRINTTAB(13);"[221]" 2030 PRINT"STA $8000,X [221] 9D 00 80":PRINTTAB(13);"[221]" 2040 PRINT"INX [221] E8":PRINTTAB(13);"[221]" 2050 PRINT"BNE $F8 [192][189] D0 F8" 2055 PRINT"RTS 60" 2060 PRINT"WIR SCHREIBEN DIESES PROGRAMM MIT EINEM" 2070 PRINT"ASSEMBLER (Z.B. SYNTAX-ASSEMBLER) ODER" 2080 PRINT"MIT EINEM MONITOR (Z.B. TIM-MONITOR) IN" 2090 PRINT"DEN 2. KASSETTENPUFFER AB $033A." 2110 I=10:GOSUB5000:IFFLTHEN1800 2200 PRINT"[147]MASCHINENPROGRAMME STARTET MAN MIT DEM" 2210 PRINT"UNTERPROGRAMMAUFRUF 'SYS (....)'. NACH" 2220 PRINT"DEM ABARBEITEN DES UNTERPROGRAMMS MUSS" 2230 PRINT"DER RUECKSPRUNG IN DAS HAUPTPROGRAMM" 2240 PRINT"FOLGEN. DAHER ENDET UNSER PROGRAMM MIT" 2250 PRINT"DEM RUECKSPRUNGBEFEHL 'RTS'." 2310 I=11:GOSUB5000:IFFLTHEN2000 2400 PRINT"[147]FUNKTIONSWEISE :":PRINTU$;U$ 2405 PRINT"'LDX # $00' LAED $00 INS XR.DAS XR WIRD" 2410 PRINT" ";U$:PRINT"ALS ZAEHLER VERWENDET." 2420 PRINT"'LDA $00,X' LAED DEN INHALT DES ZERO-" 2430 PRINT" ";U$:PRINT"PAGESPEICHERS $00+X IN DEN AC. DA DAS" 2450 PRINT"XR BEIM ERSTEN DURCHLAUF DEN INHALT $00" 2455 PRINT"HAT, IST DIE SPEICHERADRESSE EINFACH :" 2460 PRINT"$00 + X = $00 + $00 = $00." 2510 I=12:GOSUB5000:IFFLTHEN2200 2600 PRINT"[147]'STA $8000,X' SPEICHERT DEN INHALT DES" 2620 PRINT" [197][197]";U$:PRINT"AC IN DEN SPEICHER $8000+X, BEIM ERSTEN" 2630 PRINT"DURCHLAUF ALSO NACH $8000+ $00 = $8000." 2640 PRINT"'INX' ERHOEHT DEN INHALT DES XR UM 1," 2650 PRINT" [197][197][197]":PRINT"ALSO VON $00 AUF $01." 2660 PRINT"'BNE $F8' BEWIRKT EINEN RUECKSPRUNG UM" 2670 PRINTU$:PRINT"ACHT BYTES,FALLS DAS ERGEBNIS DER LETZ-" 2680 PRINT"TEN RECHENOPERATION UNGLEICH NULL WAR." 2690 PRINT"DAS WAR DER FALL (XR AUF $01 ERHOEHT)." 2710 I=13:GOSUB5000:IFFLTHEN2400 2800 PRINT"[147]DER DATENTRANSFER WIEDERHOLT SICH JETZT" 2820 PRINT"MIT X = $01, DANN MIT X = $02, ETC. DER" 2830 PRINT"ABBRUCH ERFOLGT, WENN X = $00 WIRD,ALSO" 2840 PRINT"MUSS VOR 'INX' X = $FF GEWESEN SEIN.DIE" 2850 PRINT"SCHLEIFE WIRD ALSO FUER ALLE X VON $00" 2860 PRINT"BIS $FF AUSGEFUEHRT." 2870 PRINT"DAS PROGRAMM STEHT AB $033A (= DEZ 826)" 2880 PRINT"STARTEN SIE ES MIT SYS(826) !" 2890 PRINT"VERWENDEN SIE AUCH FOLGENDES BASIC-PRO-" 2900 PRINT"GRAMM: 10 SYS (826) : GOTO 10" 3050 PRINT" - SEITE 14 - <+> [145][164][164][164][164][157][157][157][157]ENDE[146] <-> VON VORNE"; 3060 GOSUB5020:ONFLGOTO0:PRINT"[147]":END:RUN 5000 REM UMBLAETTERN 5010 PRINT" - SEITE";I;"- <+> WEITER <-> ZURUECK"; 5020 FORI=0TO11:GETX$:NEXT 5030 GETX$:IFX$=""THEN5030 5040 IFX$="+"THENFL=0:RETURN 5050 IFX$="-"THENFL=1:RETURN 5060 GOTO5030 5100 PRINTTAB(L)A$:PRINTTAB(L)"[221]";B$;"[221]":PRINTTAB(L)C$:RETURN 6150 PRINTTAB(7);" 1. BYTE $08" 10000 SYS826:GOTO10000